﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace katOS
{
    class Semaphore
    {
        public LinkedList<Process> a_list = new LinkedList<Process>();
        public int id = -1;
        public int count = -1;

        public void setID(int id)
        {
            this.id = id;
        }

        public int getID()
        {
            return id;
        }

        public int getCount()
        {
            return count;
        }

        public Semaphore(){
            count=1;
        }

        public Semaphore(int an_id)
        {
            id = an_id;
            count=1;
        }

        public bool Wait()
        {
            count--;
            if(count<0){
                //agrear este proceso a waiting queue
                //block();
                return true;
            }
            return false;
        }

        /***********************************************
         * Método: Signal
         * Uso:
         * @return booleano que dice si hay que sacar el proceso encolado o no
        ***********************************************/
        public bool Signal()
        {
            count++;
            if(count<=0)
            {
                //remover proceso P de la waiting queue
                //wakeup(P)
                if(a_list.Count==0)
                    return false; //porque no hay ningún proeso que sacar ya que la cola está vacía
                return true;//para sí sacar el proceso...
            }
            return false;
        }
        

        public void addToQueue(Process process)
        {
            process.setState(7);//setea el estado a que está en el
            a_list.AddLast(process);
            Console.WriteLine("Process in semaphore: "+a_list);
        }

        public Process outOfQueue()
        {
            Process process = null;
            if(!(a_list.Count==0)){
                process = a_list.ElementAt(0);
                a_list.RemoveFirst();
            }
            return process;
        }

        public String toString()
        {
            return "Semaphore "+id;
        }
    }
}
